OpenScope MZをFreeBSDで使おう
https://gyazo.com/70f2339911fad4bc782ab39612f2bc30
はじめに
ここでは、FreeBSDで安価なオシロスコープになる OpenScope MZ を使う方法をご紹介します。
OpenScope MZ
OpenScope MZは、Webブラウザを画面として使うタイプのオシロスコープです。
以下のような特徴があります。
WiFi経由でも、USBシリアル経由でも利用可能
オープンソース: 以下のものがオープンソース
Windows, macOS, Linuxでバイナリあり
https://gyazo.com/f068d8704205352d014e14d141a26750
CQ出版トランジスタ技術2017年12月号のプレゼントでいただきました!!
OpenScope MZの主な仕様
計測のために用いる2chのオシロスコープだけでなく、波形を生成するファンクションジェネレータもそなえています。
さらに、ロジックアナライザを使えば、TTL ICなどを使った電子回路のデバッグに用いることもできます。
オシロスコープ
チャンネル数: 2ch
最大サンプリングレート: 6.25MHz
最大帯域幅: 2MHz
最大ビット数: 12ビット
入力インピーダンス: 1MΩ
入力最大電圧: ±20V
ファンクションジェネレーター
出力可能波形: 正弦波、三角波、のこぎり波、正方形、DC出力
出力可能周波数: 1Hz~1MHz
分解能: 10ビット
出力電圧: 3Vp-p(±1.5Vオフセット付き)
チャンネル数: 1ch
ロジックアナライザ
チャンネル数: 10ch
端子電圧: 3.3V
最大サンプリングレート: 10MHz/s
最大バッファサイズ: 32640サンプル/ch
その他
電源出力(2ch, ±4V@50mA)
外部トリガー2ch
USB駆動
ユーザーが制御できるLED x 4
OpenScope MZのソフトウエア
OpenScope MZで利用するソフトウエアには、以下の2つのものがあります。
Qt使ってる…
Node.jsで書かれたOffline Build: WaveForms Live Zip
WaveForms Liveはこんな感じ
WaveForms Liveの画面は、以下の様になります。
https://gyazo.com/19e7f6f76558efa363f6f0611850764d
モバイル版(Android): ファンクションジェネレーターの矩形波を1chで観測
https://gyazo.com/2dc96daedd7bebdfcf1faebe76c9edf6
https://gyazo.com/ebb3b30d0bd5eedaa1cda52c04421fc0
FreeBSDから見たOpenScope MZ
FreeBSDとOpenScope MZをUSBで接続すると、OpenScope MZはUSBシリアルデバイス(uftdi)として認識されます。
シリアルデバイス/dev/cuaU0などとして使う場合は、事前にkldload uftdiしておくのを忘れないように
code:dmesg
ugen3.3: <Digilent Inc Digilent OpenScope> at usbus3
uftdi0 on uhub1
uftdi0: <Digilent OpenScope> on usbus3
速度は1250000でつながる
code:shell
% sudo cu -l /dev/cuaU0 -s 1250000
Connected
{"statusCode":2684354567,"Char Location":4}
Enter the number of the operation you would like to do:
1. Enter JSON mode
2. Calibrate the instruments
3. Save the current calibration values
4. Manage your WiFi connections
5. View all files names on the SD card
6. View all files names in flash
7. Set the Oscilloscope input gain
FreeBSDでOpenScope MZを使うための方法
FreeBSDでOpenScope MZを使うためには、以下のような4つの方法が考えられます。
WiFi経由で使う
1. △すでに無線LANの設定がおこなれており、そのIPアドレスがわかる場合に、Webブラウザ経由でWaveForms Liveを使う
2. ◎USBシリアルでつないで、WiFiの設定をする
Digilent Agentを動かしてUSBシリアル接続でローカルに使う
3. × Linuxlatorで動かす
4. × FreeBSDでbuildして動かす
1.WiFi設定されたOpenScope MZを使う
既にWiFiの設定がされたOpenScope MZがある場合、そのIPがわかればOpenScope MZを利用することができます。
WiFi設定で割り当てられているIPアドレスのhttp(80)に繋げば利用できる
ブラウザで接続すると、WaveForms Liveにフォワードされる
WaveForms LiveのConfiguration MenuからNetwork SettingsでWiFiの設定が可能
DHCPを必ず使うので、DHCPサーバで設定しない限りは固定IPにはできない
WaveFormsの起動時の画面は、以下のようになります。
(上)Hostname: ネットワーク経由で接続する
(下)osm: Digilent Agent経由でUSBシリアル経由で接続する
https://gyazo.com/08c2ced63fde4c444d7a588d00ffa059
USBシリアル(osm)の設定で設定(Configure)を選択すると、以下のような画面が表示されます。
https://gyazo.com/f34b412bec46afec179c7f2ce1107aa2
Network SettingsのSETUP WIFIを選択すると、以下のようなネットワーク設定の画面になります。
ここで、Available NetworksからSSIDを選択して、Saved Networksに登録していきます。
https://gyazo.com/93b6a752e3f3db912b4cbc7eba5ab1c5
WiFi設定の画面は、以下のとおりです。
設定できる項目は、Passwordだけとなります。
https://gyazo.com/3145fcc5fd8f2a0bc6028d013ce74e90
問題点
WiFiの設定を行うために、別に母艦が必要になる
WiFiのDHCPで割り当てられるIPアドレスを知っている必要がある
WiFi環境が必須
2.FreeBSDでUSBシリアル経由でWiFi設定をする
FreeBSDからUSBシリアル経由でOpenScope MZに接続することで、各種設定をすることができます。
ここでは、FreeBSDからWiFi設定を行う方法を説明します。
以下の手順で、シリアルからWiFiの設定を行う
シリアルに速度1250000でつなぐ
code:shell
% sudo cu -l /dev/cuaU0 -s 1250000
Connected
Enter the number of the operation you would like to do:
1. Enter JSON mode
2. Calibrate the instruments
3. Save the current calibration values
4. Manage your WiFi connections
5. View all files names on the SD card
6. View all files names in flash
7. Set the Oscilloscope input gain
4 Manage your WiFi connectionsを選ぶ
code:shell
Enter the number of the operation you would like to do:
1. View availabe WiFi networks
2. Connect to a WiFi network
3. View saved WiFi connections
4. Add a new WiFi connection
5. Delete a saved WiFi connection
6. Exit to main menu
4 Add a new WiFi connectionを選ぶと、SSIDをScanして一覧が出る
code:shell
Scanning WiFi
1. xxxxxxxxxxxxx
2. yyyyyyyyyyyyy
3. zzzzzzzzzzzzz
つなぎたいSSIDの番号を入力する(ここでは1(xxxxxxxxxxxxx)とする)
passphraseを入力する
この時、IPアドレスもわかるので、Webブラウザでここにつなげば良い(http://192.168.yy.xx/)
code:shell
Please enter PassPhrase for: xxxxxxxxxxxxx
PSK value: xx:xx:xx:....
Connected to AP:
Would you like to auto-connect to this network? Y/N
Is Linked to the physical network
Link status: 0x0
Network Initialized
My IP: 192.168.yy.xx
Gateway IP: 192.168.yy.1
Subnet mask: 255.255.255.0
Dns0: IP: 192.168.yy.1
Dns1: IP: 8.8.8.8
Dns2: IP: 8.8.4.4
Dns3: IP: 8.8.8.8
My MAC: 00:1E:C0:40:E9:02
10 Sockets Listening on IP: 192.168.yy.xx:80
問題点
WiFi環境とInternet接続が必須
3. (失敗中) LinuxlatorでDigilent Agentを動かす
Digilent Agentが使える環境では、USBシリアル接続だけでOpenScope MZを利用することができます。
Linuxlatorを使うことで、USBシリアル経由でDigilent Agentを動かせる可能性があります。
ただ、まだ、この方法は成功していません。
設定の手順は、以下のとおりです。
1. Linuxlatorを設定
3. 足りないライブラリを手動で追加
4. Digilent Agentを実行
2.1.Linuxlatorを設定する
ここでは、詳細は省略します。
とりあえず、CentOS互換環境の全部入りを作るためには、以下の方法が楽です。
code:shell
% pkg search linux-c7|awk '{print "pkg install -y ",$1}'|sudo sh
2.2.Linux版 Digilent Agentを取得・展開
LinuxlatorでDigilent Agentを動作させる準備をします。
具体的には、Digilent Agent本体を取得し、動作に足りないライブラリを足していくことになります。
debファイルを展開: ar x digilent-agent_1.0.1-1_amd64.deb
2.3. 足りないライブラリを手動で追加
このままでは、動作をさせるために必要なライブラリが足りていませんので、適宜インストールしていきます。
足りないライブラリを確認
code:shell
% ldd usr/bin/digilent-agent |grep found
libQt5Widgets.so.5 => not found
libQt5Gui.so.5 => not found
libQt5Network.so.5 => not found
libQt5SerialPort.so.5 => not found
libQt5Core.so.5 => not found
順次、足りないライブラリを入れながら、lddで確認を繰り返す
code:shell
% cd /compat/linux
% rpm2cpio < ~/Downloads/qt5-qtbase-5.9.2-3.el7.x86_64.rpm|sudo cpio -id
% rpm2cpio < ~/Downloads/qt5-qtserialport-5.9.2-1.el7.x86_64.rpm |sudo cpio -id
︙
2.4. Linuxlator上でDigilent Agentを実行する
以下のようにdigilent-agentを実行するが、panicしますorz
code:shell
$ export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib64/qt5/plugins/platforms/
$ sudo -E ./digilent-agent
https://gyazo.com/6a39c2966561be6e429447e7632e2e72
本当のところはよくわからないが、DRMで死んでいるので、手動で追加したlibGL.so.1周りが怪しいと思われます。
4.Digilent AgentをFreeBSDでbuildする
FreeBSDでDigilent Agentをソースからコンパイルして利用することもできます。
ただ、この方法もまだ動作していません。
手順は、以下のとおりです。
githubからソースを持ってくる
code:shell
Cloning into 'digilent-agent'...
remote: Enumerating objects: 29, done.
remote: Counting objects: 100% (29/29), done.
remote: Compressing objects: 100% (21/21), done.
remote: Total 2071 (delta 12), reused 16 (delta 8), pack-reused 2042
Receiving objects: 100% (2071/2071), 30.27 MiB | 61.00 KiB/s, done.
Resolving deltas: 100% (1080/1080), done.
code:shell
% cd digilent-agent
% git submodule init
% git submodule update
Cloning into '/usr/home/mutoh/work/Digilent/digilent-agent/lib/digilent/pgm'...
Cloning into '/usr/home/mutoh/work/Digilent/digilent-agent/lib/digilent/qtSerial'...
Submodule path 'lib/digilent/pgm': checked out '428ad08c7160d6c85f731e1826b234aaf2d52671'
Submodule path 'lib/digilent/qtSerial': checked out '1b90649dcad258b548f0a789078d0561ac6a9815'
ports/comms/qt5-serialportにpatchを当てて、build & installする(後述)
patchを当てる(後述)
buildする
code:shell
% qmake
% make
実行する
code:shell
% export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/local/lib/qt5/plugins/platforms
% ./digilent-agent
Agent::Agent() thread: QThread(0x80302e020)
MainWindow::MainWindow() thread: QThread(0x80302e020)
Using config file /usr/home/mutoh/.config/digilent/digilent-agent.ini
StaticFileController: docroot=/usr/share/digilent/digilent-agent/www, encoding=UTF-8, maxAge=90000
StaticFileController: cache timeout=60000, size=1000000
HttpRouter::HttpRouter() Thread QThread(0x80302e020)
AgentConfigCtrl::AgentConfigCtrl() thread: QThread(0x80302e020)
HttpListener::HttpListener() thread: QThread(0x80302e020)
HttpListener: Listening on port 42135
digilent-agentをFreeBSDでbuildするためのpatch
Linux用の設定が使えるように、-DQ_OS_LINUXを追加する
code:Makefile.diff
$ diff -u Makefile.org Makefile
--- Makefile.org 2019-06-27 12:15:06.877320000 +0900
+++ Makefile 2019-06-27 12:15:50.931064000 +0900
@@ -14,7 +14,7 @@
CC = clang
CXX = clang++
-DEFINES = -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_SERIALPORT_LIB -DQT_CONCURRENT_LIB -DQT_CORE_LIB
+DEFINES = -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_SERIALPORT_LIB -DQT_CONCURRENT_LIB -DQT_CORE_LIB -DQ_OS_LINUX
CFLAGS = -pipe -O2 -pthread -Wall -W -fPIC $(DEFINES)
CXXFLAGS = -pipe -O2 -std=gnu++11 -pthread -Wall -W -fPIC $(DEFINES)
INCPATH = -I. -Isrc/httpServer/core -I/usr/local/include/qt5 -I/usr/local/include/qt5/QtWidgets -I/usr/local/include/qt5/QtGui -I/usr/local/include/qt5/QtNetwork -I/usr/local/include/qt5/QtSerialPort -I/usr/local/include/qt5/QtConcurrent -I/usr/local/include/qt5/QtCore -I. -I/usr/local/include/libdrm -I. -I/usr/local/include -I/usr/local/lib/qt5/mkspecs/freebsd-clang
NULLだとうまく行かないので、0にする
code:digilentPgm.cpp.diff
$ diff -u lib/digilent/pgm/digilentPgm.cpp{.org,}
--- lib/digilent/pgm/digilentPgm.cpp.org 2019-06-27 12:17:33.434069000 +0900
+++ lib/digilent/pgm/digilentPgm.cpp 2019-06-27 12:18:29.092992000 +0900
@@ -415,7 +415,7 @@
unsigned short DigilentPgm::byteArrayToUShort(QByteArray array) {
if(array.length() != 2){
- return NULL;
+ return 0;
} else {
unsigned short retVal = (array0 << 8) | array1; return retVal;
@@ -424,7 +424,7 @@
unsigned int DigilentPgm::byteArrayToUInt(QByteArray array) {
if(array.length() != 4){
- return NULL;
+ return 0;
} else {
unsigned int retVal = (unsigned char)array0 << 24 | (unsigned char)array1 << 16 | (unsigned char)array2 << 8 | (unsigned char)array3; return retVal;
ports/comms/qt5-serialportでボーレート125000を使うためのpatch
ports/comms/qt5-serialportでは、そのままではボーレート1250000が使えません。
そこで、以下のようなパッチを当てる必要があります。
code:files/patch-src_serialport_qserialport.h.patch
--- src/serialport/qserialport.h.orig 2020-01-24 00:43:37 UTC
+++ src/serialport/qserialport.h
@@ -96,6 +96,7 @@ class Q_SERIALPORT_EXPORT QSerialPort : public QIODevi
Baud38400 = 38400,
Baud57600 = 57600,
Baud115200 = 115200,
+ Baud1250000 = 1250000,
UnknownBaud = -1
};
Q_ENUM(BaudRate)
code:files/patch-src_serialport_qserialport__unix.cpp.patch
--- src/serialport/qserialport_unix.cpp.orig 2020-01-24 00:57:50 UTC
+++ src/serialport/qserialport_unix.cpp
@@ -1234,6 +1234,8 @@ static const BaudRateMap createStandardBaudRateMap()
baudRateMap.insert(1152000, B1152000);
+ baudRateMap.insert(1250000, 1250000);
+
baudRateMap.insert(1500000, B1500000);
FreeBSDでDigilent Agentを動かしてみるて失敗していた部分
ここでの記述は、以前ports/comms/qt5-serialportでボーレート125000を使うためのpatchを使っていないために起こった症状で、このpatchを使うと問題は起こらなくなっています。
念の為、記録として記述は残しておきます。
上記パッチを当てたDigilent Agentは、起動することは可能ですが、うまく動作しません。
少し調べましたが、原因はシリアルの通信速度が1250000に変更できないことのようです。
とりあえず動くが、シリアルを1250000に変更するところで失敗している
Failed to updgrade serial baud rate when creating wflDevice for "cuaU0"
ので、それ以降OpenScope MZとの通信が化けてしまってうまくいかない
エラーを出しているのは、ここ
code:src/wflDevice/wflSerialDevice.cpp
WflSerialDevice::WflSerialDevice(QString address, QObject* parent) : WflDevice(parent)
{
qDebug() << "WflSerialDevice::WflSerialDevice()" << "thread: " << QThread::currentThread();
this->name = "";
this->deviceType = "UART";
//Initialize serial object, open the port and upgrade to the target baud rate (Work around Mac Issue)
this->serial = new Serial(this);
if(this->serial->open(address, 9600)) {
this->name = address;
if(!this->serial->setBaudRate(1250000)) {
qDebug() << "Failed to updgrade serial baud rate when creating wflDevice for " << address;
}
}
}
おわりに
とりあえず、FreeBSDで、WiFi経由&インターネット経由およびUSBシリアル経由でOpenScope MZが動かせるようになりました
でも、WiFiがない環境でも動かしたい!!
digilent-agentを動かして、USBシリアル経由で使いたい使えた!!
解決済み: ports/comms/qt5-serialportで、ボーレート1250000に設定するには?
更新履歴
2020/01/24: ports/comms/qt5-serialportでボーレート125000を使うためのpatchを使ってUSBシリアル経由での利用が可能になった。
2019/12/19: 初稿公開